#include "networkmanager.h"
#include <QJsonObject>
#include <QJsonDocument>
NetworkManager::NetworkManager(QObject *parent) : QObject(parent)
{

    // 创建一个 QTcpSocket 对象，用于进行 TCP 网络通信
    socket = new QTcpSocket(this);// 将 this 作为父对象，确保 socket 对象与 NetworkManager 对象的生命周期关联
    // 当 socket 有数据可读时，会触发 onReadyRead 函数
    connect(socket, &QTcpSocket::readyRead, this, &NetworkManager::onReadyRead);
}

NetworkManager::~NetworkManager()
{
    delete socket;
}

// 连接到指定主机和端口的服务器
void NetworkManager::connectToServer(const QString &host, quint16 port)
{
    socket->connectToHost(host, port);
}

// 处理 socket 接收到的数据，当 socket 有数据可读时，会自动调用该函数
void NetworkManager::onReadyRead()
{
    QByteArray data = socket->readAll();//读取
    // 发出 dataReceived 信号，并将接收到的数据作为参数传递
    // 其他对象可以连接该信号，以处理接收到的数据
    emit dataReceived(data);
}

// 向服务器发送数据    data: 要发送的数据
void NetworkManager::sendData(const QByteArray &data)
{
    if (socket->state() == QTcpSocket::ConnectedState)
    {
        socket->write(data);
    }
}
// 向服务器发送协议头    head: 指令头  len:json包的长度大小
void NetworkManager::sendHead(const QByteArray &head, int len)
{
    if (socket->state() == QTcpSocket::ConnectedState)
    {
        //constData()返回一个指向 QByteArray 内部数据的 const char* 类型的指针
        socket->write(head.constData(), len);
    }
}
void NetworkManager::sendCommand(const QString& commandValue,const QString& dataValue)
{
    QJsonObject jsonObject;
    jsonObject["command"] = commandValue;
    jsonObject["data"] = dataValue;

    QJsonDocument jsonDoc(jsonObject);
    QByteArray dataToSend = jsonDoc.toJson(QJsonDocument::Compact);

    // 在 JSON 数据外面加上双引号
    dataToSend.prepend('"');
    dataToSend.append('"');

    int jsonSize = dataToSend.size();

    QString lengthPrefix = QString("%1|%2|").arg(commandValue).arg(jsonSize);
    QByteArray prefixToSend = lengthPrefix.toUtf8();

    // 直接调用当前对象的方法
    sendHead(prefixToSend, 32);
    // 调试
    qDebug() << "Sent prefix:" << prefixToSend;

    sendData(dataToSend);
    // 调试
    qDebug() << "Sent JSON data:" << dataToSend;
}
void NetworkManager::sendBarCommand(const QString& commandValue,const QString& dataValue,const QString& macId)
{
    QJsonObject jsonObject;
    jsonObject["command"] = commandValue;
    jsonObject["data"] = dataValue;
    jsonObject["mac_id"] = macId;

    QJsonDocument jsonDoc(jsonObject);
    QByteArray dataToSend = jsonDoc.toJson(QJsonDocument::Compact);

    // 在 JSON 数据外面加上双引号
    dataToSend.prepend('"');
    dataToSend.append('"');

    int jsonSize = dataToSend.size();

    QString lengthPrefix = QString("%1|%2").arg(commandValue).arg(jsonSize);
    QByteArray prefixToSend = lengthPrefix.toUtf8();

    // 直接调用当前对象的方法
    sendHead(prefixToSend, 32);
    // 调试
    qDebug() << "Sent prefix:" << prefixToSend;

    sendData(dataToSend);
    // 调试
    qDebug() << "Sent JSON data:" << dataToSend;
}


